// 初始化 token 状态
import { login, getInfo, getUserDetailById } from '@/api/user'
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'

// 状态
const state = {
  token: getToken(), // 初始化时从本地读取状态
  userInfo: {} // 为啥不设置为null?
  // 做快捷访问时如果是一个空值，空值的属性会报错
  // 即如果想要取其中一个值，我们还可以在getters中建立相应的映射
}
// 修改状态
const mutations = {
  setToken (state, token) {
    state.token = token // 设置 token,只是修改 state 的数据，保存token到vuex
    setToken(token) // 保存token到本地
  },
  // 删除 token
  removeToken (state) {
    state.token = null
    removeToken()
  },
  // 设置用户资料
  setUserInfo (state, data) {
    state.userInfo = { ...data } // 响应式的数据更新，浅拷贝？？
  },
  // 删除用户信息
  removeUserInfo (state) {
    state.userInfo = {}
  }
}
// 执行异步
const actions = {
  // 请求后台数据 返回 token
  async login (context, data) {
    const result = await login(data)
    // 成功了才表示获取到了数据
    // 相应拦截器去除了一层 data 且做了相应的判断
    // actions 修改 state 调用 mutation 中的 setToken
    context.commit('setToken', result)
    // 写入时间戳
    setTimeStamp() // 将当前的最新时间写入缓存
  },
  // 获取用户资料 action
  async getUserInfo (context) {
    const result = await getInfo() // 获取信息返回值的结果
    const baseInfo = await getUserDetailById(result.userId) // 用于获取头像
    const baseresult = { ...result, ...baseInfo }
    context.commit('setUserInfo', baseresult)
    return result // 为后期做权限埋下伏笔
  },
  logout (context) {
    // 删除 token
    context.commit('removeToken')
    // 清除用户资料
    context.commit('removeUserInfo')
    // 清空路由数组（vuex）
    // 表示向上到父级寻找方法或属性 { root: ture }
    context.commit('permissions/setRoutes', [], { root: true })
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
